package com.bookrecomm.controller;

import com.bookrecomm.entity.Category;
import com.bookrecomm.service.CategoryService;
import com.bookrecomm.vo.CategoryVO;
import com.bookrecomm.vo.ResultVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * 分类控制器
 * 处理图书分类相关的请求
 */
@RestController
@RequestMapping("/categories")
public class CategoryController {

    @Autowired
    private CategoryService categoryService;

    /**
     * 获取所有分类列表
     * @return 分类列表
     */
    @GetMapping
    public ResultVO<List<CategoryVO>> getAllCategories() {
        System.out.println("进入getAllCategories方法 - 时间: " + java.time.LocalDateTime.now());
        List<CategoryVO> categories = categoryService.findAll();
        System.out.println("返回分类数据数量: " + (categories != null ? categories.size() : "null"));
        if (categories != null) {
            categories.forEach(c -> System.out.println("分类 ID: " + c.getId() + ", 名称: " + c.getName()));
        }
        return ResultVO.success("获取成功", categories);
    }
    
    /**
     * 查看数据库中的原始分类数据(调试用端点)
     * @return 原始分类数据
     */
    @GetMapping("/debug/raw")
    public ResultVO<List<Category>> getRawCategories() {
        List<Category> rawData = categoryService.findRawCategories();
        return ResultVO.success("获取原始分类数据成功", rawData);
    }

    /**
     * 获取分类树
     * @return 分类树
     */
    @GetMapping("/tree")
    public ResultVO<List<CategoryVO>> getCategoryTree() {
        List<CategoryVO> categoryTree = categoryService.findCategoryTree();
        return ResultVO.success("获取成功", categoryTree);
    }

    /**
     * 根据ID查询分类
     * @param id 分类ID
     * @return 分类信息
     */
    @GetMapping("/{id}")
    public ResultVO<CategoryVO> getCategoryById(@PathVariable Long id) {
        CategoryVO category = categoryService.findById(id);
        return ResultVO.success("获取成功", category);
    }

    /**
     * 根据父ID查询子分类
     * @param parentId 父分类ID
     * @return 子分类列表
     */
    @GetMapping("/parent/{parentId}")
    public ResultVO<List<CategoryVO>> getCategoriesByParentId(@PathVariable Long parentId) {
        List<CategoryVO> categories = categoryService.findByParentId(parentId);
        return ResultVO.success("获取成功", categories);
    }

    /**
     * 添加分类（仅管理员可操作）
     * @param category 分类信息
     * @return 添加后的分类信息
     */
    @PostMapping
    @PreAuthorize("hasRole('ADMIN')")
    public ResultVO<CategoryVO> addCategory(@Valid @RequestBody Category category) {
        CategoryVO categoryVO = categoryService.addCategory(category);
        return ResultVO.success("添加成功", categoryVO);
    }

    /**
     * 更新分类（仅管理员可操作）
     * @param id 分类ID
     * @param category 分类信息
     * @return 更新后的分类信息
     */
    @PutMapping("/{id}")
    @PreAuthorize("hasRole('ADMIN')")
    public ResultVO<CategoryVO> updateCategory(
            @PathVariable Long id,
            @Valid @RequestBody Category category) {
        
        CategoryVO categoryVO = categoryService.updateCategory(id, category);
        return ResultVO.success("更新成功", categoryVO);
    }

    /**
     * 删除分类（仅管理员可操作）
     * @param id 分类ID
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    @PreAuthorize("hasRole('ADMIN')")
    public ResultVO<Boolean> deleteCategory(@PathVariable Long id) {
        boolean success = categoryService.deleteCategory(id);
        return ResultVO.success("删除成功", success);
    }
}
